package br.com.vilababy.sigvb.validadores;

import java.util.Date;

import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.component.UIInput;
import javax.faces.context.FacesContext;
import javax.faces.validator.FacesValidator;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;

import org.joda.time.DateTime;
import org.joda.time.Days;

import br.com.vilababy.sigvb.SIGVBUtil;
import br.com.vilababy.sigvb.constantes.SIGVBEnum;

@FacesValidator("alunoValidator")
public class AlunoValidator implements Validator {
	
	/**
	 * @author Diego Patrick da Silva Santos
	 */
	@Override
	public void validate(FacesContext contexto, UIComponent componente, Object objeto)
			throws ValidatorException {
		FacesMessage mensagem = null;
		mensagem = validarCamposObrigatoriosVazios(objeto, componente);
		mensagem = validarRangeData(objeto, componente, mensagem);
		SIGVBUtil.tratarErroValidacao(mensagem);
	
	}
	
	@SuppressWarnings("incomplete-switch")
	private FacesMessage validarCamposObrigatoriosVazios(Object objeto, UIComponent componente) {
		FacesMessage mensagem = null;
		
		if (objeto == null || (objeto != null && (objeto instanceof String ? ((String)objeto).isEmpty() : false))) {
			SIGVBUtil.adicionarParametroRetorno("preenchido", false);

			switch (SIGVBEnum.getSIGVBEnum(componente.getId())) {
					case ID_NOME_ALUNO: mensagem = SIGVBUtil.retornarMensagemErro(SIGVBUtil.getValorMensagem(SIGVBEnum.FALHA_CADASTRO.getValor()), SIGVBUtil.getValorMensagem(SIGVBEnum.NOME_ALUNO_INFORME.getValor()));
					break;
					case ID_APELIDO_ALUNO: mensagem = validarPreechimentoNome(componente);
					break;
					//case ID_DATA_NASC: mensagem = SIGVBUtil.retornarMensagemErro(SIGVBUtil.getValorMensagem(SIGVBEnum.FALHA_CADASTRO.getValor()), SIGVBUtil.getValorMensagem(SIGVBEnum.DATA_NASC_INFORME.getValor()));
					//break;
					//case ID_NOME_PAI: mensagem = validarPreenchimentoPais(componente);
					//break;
				}
		} else {
			SIGVBUtil.adicionarParametroRetorno("preenchido", true);
		}
		
		return mensagem;
	}
	
	private FacesMessage validarPreechimentoNome(UIComponent componente) {
		String nomeAluno = null;
		
		UIInput nomeComponente = (UIInput) componente.getAttributes().get(SIGVBEnum.ID_NOME_ALUNO.getValor());
		if (nomeComponente != null)
			nomeAluno = (String) nomeComponente.getSubmittedValue();
		
		return nomeAluno != null && !nomeAluno.isEmpty() ? null : SIGVBUtil.retornarMensagemErro(SIGVBUtil.getValorMensagem(SIGVBEnum.FALHA_CADASTRO.getValor()), SIGVBUtil.getValorMensagem(SIGVBEnum.NOME_ALUNO_INFORME.getValor()));
	}
	
//	private FacesMessage validarPreenchimentoPais(UIComponent componente) {
//		String nomeMae = null;
//		
//		UIInput nomeComponente = (UIInput) componente.getAttributes().get(SIGVBEnum.NOME_MAE.getValor());
//		if (nomeComponente != null)
//			nomeMae = (String) nomeComponente.getSubmittedValue();
//		
//		return nomeMae != null && !nomeMae.isEmpty() ? null :  SIGVBUtil.retornarMensagemErro(SIGVBUtil.getValorMensagem(SIGVBEnum.FALHA_CADASTRO.getValor()), SIGVBUtil.getValorMensagem(SIGVBEnum.NOME_PAI_MAE_INFORME.getValor()));
//	}
	
	private FacesMessage validarRangeData(Object objeto, UIComponent componente, FacesMessage mensagem) {
		
		if (objeto != null && SIGVBEnum.getSIGVBEnum(componente.getId()) == SIGVBEnum.ID_DATA_NASC) {
			DateTime data = new DateTime((Date)objeto); 
			if (Days.daysBetween(data, new DateTime()).getDays() == 0 || new DateTime().isBefore(data))
				mensagem = SIGVBUtil.retornarMensagemErro(SIGVBUtil.getValorMensagem(SIGVBEnum.FALHA_CADASTRO.getValor()), SIGVBUtil.getValorMensagem(SIGVBEnum.DATA_NASC_MAIOR_ATUAL.getValor()));
		}
		
		return mensagem;
	}
}
